package com.gtc.zsk.manager;

import com.gtc.zsk.common.ErrorCode;
import com.gtc.zsk.exception.BusinessException;
import com.gtc.zsk.exception.ThrowUtils;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class RedisLimiterManager {

    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流
     * @param key 区分不同的限流器 如针对用户限流则可以把用户id作为key 不同的限流器单独统计
     */
    public void doRateLimit(String key){
        //创建一个名称为user_limiter的限流器  每秒最多访问两次
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        //每秒2个令牌
        //rateLimiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
        rateLimiter.trySetRate(RateType.OVERALL,6,2, RateIntervalUnit.SECONDS);
        //每来一个操作  请求一个令牌
        boolean canOp = rateLimiter.tryAcquire(1);
        ThrowUtils.throwIf(!canOp, ErrorCode.OPERATION_ERROR, "你的手速太快了,请慢一点 _(:з」∠)_");
    }
}
